IsUnion<T>
Tがunion型かどうかを判断してtrueorfalseを返す
使用例
code:ts
type case1 = IsUnion<string> // false
type case2 = IsUnion<string|number> // true
定義時の考え方
「Union型かどうか?」の判定をしたい
.. extends ..で条件分岐したいが、直接的にUnion型かどうかを判定する方法がない
そこで「Union型特有の機能はなんだっけ?」を考える
Union型なら.. extendsを使うと分配され、そうでなければ分配されない
分配された個々を、元の型と比較して、同じかどうかを確かめればいい
例えば、Union型以外の時、
分配前はstring、分配後もstringで同じになる
例えば、Union型の時、
分配前のa|b|cで、分配後はaで異なるものになる
次に、分配前と分配後を比較する必要がある
しかし、普通に分配後 extends 分配前と書くと常に真になってしまう
そこで、反転して書きたい分配前 extends 分配後
しかし、a|b|c extends aの様に書くと、再びa|b|cが分配されてしまうので困る
結果的に分配前[] extends 分配後[]とする
これで判断できる
定義1
code:ts
type IsUnion<T, U = T> =
T extends T ? (U extends T ? false : true) : never;
型引数のUは、「分配前のT」が欲しいために定義している
定義2
定義1とほぼ同じだが、ちょっとスマート
code:ts
type IsUnion<T> =
T[] extends (T extends T ? T[] : never)
? false
: true;
(..)の部分は
T[] extends ..の部分は普通に考えればわかるmrsekut.icon
定義3
code:ts
type IsUnion<T, U = T> = T extends T ? Not<Equal<T, U>> : never;
定義1とほぼ同じ